package ev.ftw.gff;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * Clase para trabajar con ficheros del formato GFF. <br>
 * Realiza la lectura/escritura de los mismos utilizando objetos del tipo FragConocido para ello.
 *  
 * @date 01.08.2012
 * @author Enrique Vázquez de Luis
 *
 */
public class GFFFileIO {
	
	/**
	 * Función estática para leer de un fichero GFF los fragmentos.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param fichero La ruta del fichero a leer.
	 * @return Un array con todos los fragmentos leidos.
	 */
	public static FragConocido [] leerDeFichero(String fichero){
		ArrayList<FragConocido> fragmentos = new ArrayList<FragConocido>();
		String aux;
		FragConocido frag;
		String [] parametros;
		
		
		try {
			Scanner s = new Scanner(new File(fichero));
			aux = s.nextLine();
			while(aux.startsWith("##") && s.hasNext()) aux = s.nextLine();
			
			parametros = aux.split("\t");
			frag = new FragConocido(parametros);
			fragmentos.add(frag);
			while(s.hasNext()){
				aux = s.nextLine();
				parametros = aux.split("\t");
				frag = new FragConocido(parametros);
				fragmentos.add(frag);
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e){
			e.printStackTrace();			
		}
		
		FragConocido [] frags = new FragConocido[fragmentos.size()];
		for(int i = 0; i < fragmentos.size(); i++){
			frags[i] = (FragConocido)fragmentos.get(i);
		}
		return frags;
	}
	
	/**
	 * Función estática para escribir los fragmentos pasados como parámetro en un fichero.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param fichero Ruta del fichero que se debe rellenar.
	 * @param fragmentos Array de fragmentos que se deben volcar en el fichero.
	 */
	public static void escribeEnFichero(String fichero, FragConocido [] fragmentos){
		try {
			PrintWriter p = new PrintWriter(new File(fichero));
			for(int i = 1; i < fragmentos.length; i++){
				p.println(fragmentos[i]);
			}
			p.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Función estática para la escritura de los fragmentos en un fichero con una serie de líneas al inicio del mismo.
	 * 
	 * @date 01.08.2012
	 * @author Enrique Vázquez de Luis
	 * @param fichero Ruta al fichero que se debe rellenar.
	 * @param fragmentos Fragmentos que se deben volcar al fichero.
	 * @param inicio Array de líneas que deben aparecer al inicio del fichero.
	 */
	public static void escribeEnFichero(String fichero, FragConocido [] fragmentos, String [] inicio){
		try {
			PrintWriter p = new PrintWriter(new File(fichero));
			
			for(int i = 0; i < inicio.length; i++){
				p.println(inicio[i]);
			}
			
			for(int i = 1; i < fragmentos.length; i++){
				p.println(fragmentos[i]);
			}
			p.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

}	
